package day1_array.leetcode;

/**
 * @author yuisama
 * @date 2022/11/10 15:21
 * 轮转数组
 **/
public class Num189_RotateArray {
    // 1.循环数组的下标思路，创建新的数组，进行元素赋值即可
//    public void rotate(int[] nums, int k) {
//        int[] temp = new int[nums.length];
//        // 遍历原数组，将原数组元素放在移动k步后的新数组位置上
//        for (int i = 0; i < nums.length; i++) {
//            temp[(i + k) % nums.length] = nums[i];
//        }
//        // 让nums上的元素依次从temp上赋值
//        System.arraycopy(temp, 0, nums, 0, nums.length);
//    }
    // 2.数组原地反转法
    public void rotate(int[] nums, int k) {
        // 超出数组长度的取余处理
        k %= nums.length;
        // 先将整个数组反转
        reverse(nums,0,nums.length - 1);
        // 反转两个子数组
        reverse(nums,0,k - 1);
        reverse(nums,k,nums.length - 1);
    }
    private void reverse(int[] nums,int left,int right) {
        while (left < right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left ++;
            right --;
        }
    }
}